import {ref, computed} from 'vue'
import {defineStore} from 'pinia'
import {useUserStore} from './user.js'
import {getCartListAPI, addCartAPI, delCartAPI, mergerCartAPI} from '@/apis/cart.js'

export const useCartStore = defineStore('cart', () => {
        const cartList = ref([])
        // 判断是否登录
        const userStore = useUserStore()
        const isLogin = computed(() => userStore.userInfo.token)
        // 获取最新购物车列表
        const getList = async () => {
                const res = await getCartListAPI()
                cartList.value = res.data.result
        }
        // 添加购物车
        const addCart = async (goodsObj) => {
                if (isLogin.value) {
                        // 登录之后的加入购物车逻辑
                        //调接口
                        await addCartAPI({
                                skuId: goodsObj.skuId,
                                count: goodsObj.count
                        })
                        // 覆盖本地购物车列表
                        await getList()
                } else {
                        // 未登录的本地购物车逻辑
                        // 添加购物车操作
                        // 已添加过---count+1
                        // 没添加过---直接push
                        // 思路：通过匹配传递过来的商品对象中的skuId能不能在cartList中找到，找到了就是添加过
                        const goodItem = cartList.value.find(item => goodsObj.id === item.skuId)
                        if (goodItem) {
                                // 找到了
                                goodItem.count++
                        } else {
                                // 没找到
                                cartList.value.push(goodsObj)
                        }
                }
        }
        // 删除购物车
        const delCart = async (skuId) => {
                if (isLogin.value) {
                        // 调接口实现删除逻辑
                        await delCartAPI([skuId])
                        // 覆盖本地购物车列表
                        await getList()
                } else {
                        // 本地购物车删除逻辑
                        // 思路：1、找到要删除项的下标值---splice
                        const idx = cartList.value.findIndex(item => skuId === item.skuId)
                        cartList.value.splice(idx, 1)
                        // 思路：2、filter
                        // cartList.value = cartList.value.filter(item => item.id !== skuId)
                }
        }
        // 单选功能
        const singleCheck = (skuId, selected) => {
                // 通过skuId找到要修改的那一项，然后把它的selected修改为传过来的selected
                const goodItem = cartList.value.find(item => item.skuId === skuId)
                goodItem.selected = selected

        }
        // 全选功能
        const allCheck = (selected) => {
                // 把cartList中的每一项的selected都设置为当前的selected
                cartList.value.forEach(item => item.selected = selected)
        }

        // 清除购物车
        const clearCart = () => {
                cartList.value = []
        }
        // 计算属性

        // 总数量
        const allTotal = computed(() => {
                // 下面的return都可以省略 去掉大括号
                return cartList.value.reduce((count, item) => count + item.count, 0)
        })
        // 总价格
        const allPrice = computed(() => {
                return cartList.value.reduce((price, item) => price + item.count * item.price, 0)
        })
        // 是否全选
        const isAll = computed(() => {
                return cartList.value.every(item => item.selected)
        })

        // 已选择的总数量
        const allSelectedTotal = computed(() => {
                // 可以链式调用是因为，前面一个返回的是数组
                return cartList.value.filter(item => item.selected).reduce((a, i) => a + i.count, 0)
        })
        // 已选择的总价格
        const allSelectedPrice = computed(() => {
                return cartList.value.filter(item => item.selected).reduce((a, i) => a + i.count * i.price, 0)
        })
        return {
                cartList,
                addCart,
                delCart,
                allTotal,
                allPrice,
                singleCheck,
                isAll,
                allCheck,
                allSelectedTotal,
                allSelectedPrice,
                clearCart,
                getList
        }
}, {
        persist: true,
},)
